/**     
 * @Title: RedisSessionDAO.java   
 * @Package com.yitong.spring.session   
 * @Description: TODO
 * @author weiwei 
 * @date 2017年7月21日 下午3:48:42   
 * @version V1.0     
 */
package com.yitong.spring.session;

import java.io.Serializable;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.shiro.cache.AbstractCacheManager;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import org.apache.shiro.cache.MapCache;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.CachingSessionDAO;
import org.apache.shiro.session.mgt.eis.SessionIdGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.yitong.utils.TokenUtils;

/**
 * @ClassName: RedisSessionDAO
 * @Description: redis实现共享session
 * @author weiwei
 * @date 2017年7月21日 下午3:48:42
 * 
 */
public class RedisSessionDAO extends CachingSessionDAO {

	private final static Logger LOGGER = LoggerFactory.getLogger(RedisSessionDAO.class);

	public RedisSessionDAO() {
		this.setSessionIdGenerator(new SessionIdGenerator() {
			@Override
			public Serializable generateId(Session session) {
				return TokenUtils.generateUUIDToken(true);
			}
		});
		setCacheManager(new AbstractCacheManager() {
			@Override
			protected Cache<Serializable, Session> createCache(String name) throws CacheException {
				return new MapCache<Serializable, Session>(name, new ConcurrentHashMap<Serializable, Session>());
			}
		});
	}

	// 创建session，保存到数据库
	@Override
	protected Serializable doCreate(Session session) {
		Serializable sessionId = generateSessionId(session);
		assignSessionId(session, sessionId);
		storeSession(sessionId, session);
		return sessionId;
	}

	protected boolean storeSession(Serializable id, Session session) {
		if (id == null) {
			throw new NullPointerException("id argument cannot be null.");
		}
		// TODO 将session信息持久化
		return true;
	}

	// 获取session
	@Override
	protected Session doReadSession(Serializable sessionId) {
		LOGGER.debug("获取session:{}", sessionId);
		// TODO
		return null;
	}

	// 更新session的最后一次访问时间
	@Override
	protected void doUpdate(Session session) {
		// TODO
	}

	// 删除session
	@Override
	protected void doDelete(Session session) {
		// TODO
	}
}
